package com.asus.oplay.asusuitest;

import java.io.File;
import java.util.List;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;

@SuppressLint("SdCardPath")
public class Version {

	private int[] versionCode1;// 需要安装的软件版本号
	private String[] packageName1;// 需要安装的软件的包名
	private int[] versionCode2;// 已经安装的软件版本号
	private String[] packageName2;// 已经安装的软件的包名
	private String testPath = "/mnt/usbdrive/usb1.1/.factorymode_install";// 指定位置更新的目录
	private String[] AllApk;// 记录指定目录下的apk文件
	private String[] AllApkPath;// 记录指定目录下apk文件的路径
	private String[] CanUpdate;
	private File file;
	public int flag;// 记录需要更新的数量
	private Context Vcontext;// 上下文
	
	private String TAG="Version";	////sonic for test

	// 初始化获取上下文
	public Version(Context context) {

		this.Vcontext = context;// 获取上下文
		this.Refresh();// 核心运算

	}

	// 利于刷新界面
	public void Refresh() {
		// 初始化
		this.file = new File(testPath);
		this.AllApk = file.list();
		Log.d(TAG,"sonic==test"+AllApk);
		
		this.AllApkPath = new String[AllApk.length];
		this.versionCode1 = new int[AllApk.length];
		this.packageName1 = new String[AllApk.length];
		this.versionCode2 = new int[AllApk.length];
		this.packageName2 = new String[AllApk.length];
		this.CanUpdate = new String[AllApk.length + 1];
		this.flag = 0;

		this.GetFilePath();// 获取要安装的软件的路径
		for (int i = 0; i < AllApk.length; i++) {
			this.initunstallapk(AllApkPath[i], i);// 初始化
			this.contrast(packageName1[i], versionCode1[i], AllApkPath[i], i);// 对比判断是否更新
		}
		// 弹框显示所有在test文件夹下的apk均已扫描完毕。
		Toast.makeText(Vcontext, "test文件夹下的apk均已扫描完毕！", Toast.LENGTH_LONG)
				.show();
	}

	// 获取指定文件下apk的绝对路径
	private void GetFilePath() {
		for (int i = 0; i < AllApk.length; i++) {
			AllApkPath[i] = file.getAbsolutePath() + "/" + AllApk[i];
		}
	}

	// 初始化需要安装的软件信息，给版本号，包名赋值
	private void initunstallapk(String ApkPath, int i) {
		PackageManager unbag = Vcontext.getPackageManager();
		PackageInfo installapk = unbag.getPackageArchiveInfo(ApkPath, 0);
		this.versionCode1[i] = installapk.versionCode;
		this.packageName1[i] = installapk.packageName;
	}

	// 获取已经安装的软件的信息，并以包名对比找出版本号
	private void contrast(String packageName1, int versionCode1,
			String AllApkPath, int i) {
		PackageManager inbag = Vcontext.getPackageManager();
		List<PackageInfo> packs = inbag.getInstalledPackages(0);

		int size = packs.size();
		for (int j = 0; j < size; j++) {
			PackageInfo suit = packs.get(j);

			if (packageName1.equals(suit.packageName)) {

				this.versionCode2[i] = suit.versionCode;
				this.packageName2[i] = suit.packageName;
				break;
			} else {
				// System.out.println(suit.packageName);
				// System.out.println(this.packageName1);
			}
		}
		System.out.println("找到了");
		// 对比决定是否安装，并告知应该是在什么情况下安装的如版本更高，或原此设备没有安装此软件，故安装。
		if (packageName2[i] != null) {
			if (this.versionCode2[i] < versionCode1) {
				// 弹框显示+软件名+已经安装，但是sdc中安装软件较原版本高（附上版软件名+版本号），是否安装更新
				String string = this.AllApk[i] + "已安装，但sdc发现较高版本(version："
						+ this.versionCode2[i] + "),是否安装?";
				showNoticeDialog(string, AllApkPath);
				this.CanUpdate[i] = this.AllApk[i];
				flag++;
			} else {
				// 弹框显示+软件名+已安装，且是最新版本（附上版软件名+版本号），无需更新。
				String string = AllApk[i] + "~version：" + this.versionCode2[i]
						+ "已经是最新版本，不需要更新！";
				Toast.makeText(Vcontext, string, Toast.LENGTH_LONG).show();
			}
		} else {
			// 弹框显示+软件名+没有安装，在sdc发现安装文件（附上版软件名+版本号），是否安装
			String string = "在sdc发现安装文件 (" + AllApk[i] + "~version："
					+ versionCode1 + "),是否现在安装?";
			showNoticeDialog(string, AllApkPath);
			this.CanUpdate[i] = this.AllApk[i];
			flag++;
		}
	}

	// 获取test目录下的apk名及版本信息
	public String getFileApkCode() {
		String[] ApkCode = new String[AllApk.length];
		String apkcode = new String();
		for (int i = 0; i < AllApk.length; i++) {
			ApkCode[i] = this.AllApk[i] + "~version:"
					+ String.valueOf(this.versionCode1[i] + "\n");
			apkcode += ApkCode[i].toString();
		}
		return apkcode;
	}

	// 获取本设备能更新的apk
	public String getCanUpdate() {
		String[] update = new String[AllApk.length];
		String canupdate = new String();
		for (int i = 0; i < AllApk.length; i++) {
			while (this.CanUpdate[i] != null) {
				update[i] = this.CanUpdate[i] + "~version:"
						+ String.valueOf(this.versionCode1[i] + "\n");
				canupdate += update[i].toString();
				i++;
			}
			continue;
		}
		return canupdate;
	}

	// 安装本软件
	private void installApk(String ApkPath) {
		File apkfile = new File(ApkPath);
		if (!apkfile.exists()) {
			return;
		}
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + apkfile.toString()),
				"application/vnd.android.package-archive");
		Vcontext.startActivity(i);
	}

	// 弹出对话框"没有安装本软件，准备静默安装"
	private void showNoticeDialog(String string, final String ApkPath) {
		// 构造对话框
		AlertDialog.Builder builder = new Builder(Vcontext);
		builder.setTitle("提示：");
		builder.setMessage(string);

		// 立即更新
		builder.setPositiveButton("立即安装", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
				installApk(ApkPath);
			}
		});
		// 暂不更新
		builder.setNegativeButton("暂不安装", new OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});

		Dialog noticeDialog = builder.create();
		noticeDialog.show();
	}

}
